package com.treeroot.security.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    @PreAuthorize("hasAuthority('system:dept:list')")
    public String hello() {
        return "hello";
    }
}



/**
 * hasAnyAuthority方法可以传入多个权限，只有用户有其中任意一个权限都可以访问对应资源。
 *
 * @PreAuthorize("hasAnyAuthority('admin','test','system:dept:list')")
 *     public String hello(){
 *         return "hello";
 *     }
 *
 *     hasRole要求有对应的角色才可以访问，但是它内部会把我们传入的参数拼接上 ROLE_ 后再去比较。所以这种情况下要用用户对应的权限也要有 ROLE_ 这个前缀才可以。
 *         @PreAuthorize("hasRole('system:dept:list')")
 *     public String hello(){
 *         return "hello";
 *     }
 *
 *
 *     hasAnyRole 有任意的角色就可以访问。它内部也会把我们传入的参数拼接上 ROLE_ 后再去比较。所以这种情况下要用用户对应的权限也要有 ROLE_ 这个前缀才可以
 *         @PreAuthorize("hasAnyRole('admin','system:dept:list')")
 *     public String hello(){
 *         return "hello";
 *     }
 *
 *     自定义权限校验方法
 * 我们也可以定义自己的权限校验方法，在@PreAuthorize注解中使用我们的方法。
 * @Component("ex")
 * public class SGExpressionRoot {
 *
 *     public boolean hasAuthority(String authority){
 *         //获取当前用户的权限
 *         Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
 *         LoginUser loginUser = (LoginUser) authentication.getPrincipal();
 *         List<String> permissions = loginUser.getPermissions();
 *         //判断用户权限集合中是否存在authority
 *         return permissions.contains(authority);
 *     }
 * }
 *
 * 在SPEL表达式中使用 @ex相当于获取容器中bean的名字未ex的对象。然后再调用这个对象的hasAuthority方法
 *
 *     @RequestMapping("/hello")
 *     @PreAuthorize("@ex.hasAuthority('system:dept:list')")
 *     public String hello(){
 *         return "hello";
 *     }
 *
 *     基于配置的权限控制
 *   我们也可以在配置类中使用使用配置的方式对资源进行权限控制。
 *
 *       @Override
 *     protected void configure(HttpSecurity http) throws Exception {
 *         http
 *                 //关闭csrf
 *                 .csrf().disable()
 *                 //不通过Session获取SecurityContext
 *                 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
 *                 .and()
 *                 .authorizeRequests()
 *                 // 对于登录接口 允许匿名访问
 *                 .antMatchers("/user/login").anonymous()
 *                 .antMatchers("/testCors").hasAuthority("system:dept:list222")
 *                 // 除上面外的所有请求全部需要鉴权认证
 *                 .anyRequest().authenticated();
 *
 *         //添加过滤器
 *         http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
 *
 *         //配置异常处理器
 *         http.exceptionHandling()
 *                 //配置认证失败处理器
 *                 .authenticationEntryPoint(authenticationEntryPoint)
 *                 .accessDeniedHandler(accessDeniedHandler);
 *
 *         //允许跨域
 *         http.cors();
 *     }
 *
 *
 */